package com.lcy.redistest.authenticationcode;

import redis.clients.jedis.Jedis;

import java.security.SecureRandom;
import java.util.Objects;

/**
 * @author lichenyang
 * @create 2021-05-06 9:16 上午
 * <p>
 * 需求:
 * 1.输入手机号码, 点击发送后随即生成6为数字码, 2分钟有效
 * 1.1 随即生成6为数字码: java的random函数
 * 1.2 2分钟有效: redis超时时间设置为2分钟
 * 2.输入验证码, 点击验证, 返回成功或失败
 * 2.1 从redis中取出验证码, 判断和输入的验证码是否一致
 * 3.每个手机号每天只能输入3次
 * 3.1redis 的 incr 每次发送后 +1, 大于2后就不能再发送了
 */
public class PhoneAuthenticationTest {

    public static void main(String[] args) {
        PhoneAuthenticationTest test = new PhoneAuthenticationTest();
        // 模拟发送验证码
//        test.send("17328858774");
        // 模拟验证 验证码
        test.verify("17328858774","713434");
    }

    /**
     * 生成6位数字验证码
     */
    public String getCode() {
        StringBuilder code = new StringBuilder();
        SecureRandom random = new SecureRandom();
        for (int i = 0; i < 6; i++) {
            int nextInt = random.nextInt(10);
            code.append(nextInt);
        }
        return code.toString();
    }

    /**
     * 每个手机每天只能发送3次, 并将验证码放到redis中设置过期时间
     */
    public void send(String phone) {
        Jedis jedis = new Jedis("127.0.0.1", 6379);

        // 发送次数key
        String countKey = "VerifyCode_" + phone + "_count";
        // 每个手机每天只能发送3次
        String count = jedis.get(countKey);
        if (Objects.isNull(count)) {
            // 没有发送次数, 设置发送次数为1
            jedis.setex(countKey, 24 * 60 * 60, "1");
        } else if (Integer.parseInt(count) <= 2) {
            jedis.incr(countKey);
        } else {
            System.out.println("已经发送3次, 不能再发送了");
            jedis.close();
        }

        // 将传入的验证码放到redis中, 并设置过期时间
        // 验证码key
        String codeKey = "VerifyCode_" + phone + "_code";
        String code = this.getCode();
        System.out.println("验证码为" + code);
        jedis.setex(codeKey, 120, code);
        jedis.close();
    }

    /**
     * 校验验证码
     */
    public void verify(String phone, String code) {
        // 从redis中获取验证码
        Jedis jedis = new Jedis("127.0.0.1", 6379);
        String codeKey = "VerifyCode_" + phone + "_code";
        String redisCode = jedis.get(codeKey);
        if (Objects.equals(code, redisCode)) {
            System.out.println("成功");
        } else {
            System.out.println("失败");
        }
        jedis.close();
    }

}
